漏洞环境
seeyon 8.1 sp2
分析
密码重置接口逻辑
1 | /seeyon/individualManager.do?method=resetPassword |
对应com.seeyon.v3x.personalaffair.controller.IndividualManagerController
类的resetPassword
方法
从代码中不难看出,需要longName
不为null
、canModify
参数为true
才会进入到重置密码的功能点,canModify
和loginName
是从session
中获取。
在致远中修改密码的流程中,首先是需要输入对应的手机号
或者邮箱
信息,提交修改密码请求后,服务端会向对应手机号或者邮箱发送验证码信息,用户获取到验证码再提交是否正确,验证成功后会将用户名存放至session
中,并在session
中添加canModify
为true
代表已经成功验证,最后请求如下接口修改密码;修改密码的逻辑并没有什么问题,存在问题的点在于校验验证码的功能点。
校验验证码接口
1 | /seeyon/personalBind.do?method=sendVerificationCodeToBindNum&type=validate |
对应com.seeyon.v3x.personalaffair.controller.PersonalBindController
的sendVerificationCodeToBindNum
方法
在286
行处,漏洞的关键点在于从request
中获取了origin
参数,值为zx
,那么就会在session
中设置canModify
为true
,进入此处,只需要设置type
为validate
即可。
上面的密码重置逻辑和校验验证码逻辑可以看出都是基于同一个Session
下进行操作,都是从session
中获取用户的信息。
getBindTypeByLoginName
方法就是从request
中获取loginName
, 并将loginName
存入Session
中。
最后访问/seeyon/personalBind.do?method=retrievePassword
,输入目标系统中存在的用户名,提交,就会自动将信息绑定到Session
中。
漏洞复现
访问/seeyon/personalBind.do?method=retrievePassword
,输入系统中已有的用户名并提交
访问/seeyon/personalBind.do?method=sendVerificationCodeToBindNum&type=validate&origin=zx
在session
中将canModify
设置为true
最后 访问重置密码接口/seeyon/individualManager.do?method=resetPassword&nowpwd=123456
修改成功